#include <stdio.h>
#include <malloc.h>

typedef int ElementType;
//构造数据结构
typedef struct node{
    ElementType data;
    struct node* next;
} Node;

/*struct Head{
    int length;
    struct node* next;
};*/
//链表的自动链接
/*
 * 函数名：init() creat()
 * 输入：scanf() 1.在初始化函数里使用scanf()获取数据，进行处理 2.先scanf()获取数据，存储到数组里，将数组传递给函数
 * 输出：head
 * */


//查找的实现
/*给位置，返回对应位置的节点
 * 1.函数名：findByIndex()
 * 输入:链表（链表的头节点），位置
 * 输出：Node
 * 执行代码
 * */

Node *findByIndex(Node *head,int pos){
    //循环对比，直到满足条件 pos 次
    //NULL
    int i =1;
    Node*current = NULL;
    current=head->next;

    while((i<pos)&&(current!=NULL)){
        //指针后移
        current =current->next;
        i++;
    }
    //i==pos current ==NULL
    if(i==pos){
        return current;
    }else{
        printf("未找到包含该元素的节点\n");

    }
}
/*
 * 根据给定的元素返回包含该元素的节点
 * 函数名 findByvalue()
 *
 * 输入 data,链表/链表的头节点
 * 输出：Node NULL
 * 执行代码
 *
 * */
Node* findByValue(Node *head,ElementType data){
    //写一个循环，要么current.data==data  return current
    //要么 current ==NULL,printf("不存在包含该元素的节点“)
   Node * current = head->next;
    while((current!=NULL)&&(current->data!=data)){
        current=current->next;

    }
    if(current==NULL){
        printf("不存在该节点");
        return NULL;
    } else{
        return current;
    }
}
Node * init(){
    //1 头节点
    Node *head =NULL;
    head = malloc(sizeof(Node));
    //2  current ,new
    Node *currentNode =NULL;
    currentNode = malloc(sizeof(Node));
    //2.2 开始链接
    currentNode=head;
    Node *newNode =NULL;

    ElementType data;
    printf("\n请输入一组整数，以-1作为结束的标志位\n");
    while(scanf("%d",&data)&&(data!=-1)){

        newNode = malloc(sizeof(Node));
       newNode->data = data;
       currentNode->next=newNode;//链接新插入的节点
       currentNode=currentNode->next;//指针后移

    };

    //3 结尾节点指向null
    currentNode->next=NULL;

    return head;
}

//3 遍历链表进行打印
/*
 * 函数名：traverse()
 * 输入：链表
 * 输出：无
 * */
void traverse(Node *head){
    Node* currentNode = head->next;
    while(currentNode!=NULL){
        printf("%d ",currentNode->data);
        currentNode=currentNode->next;//指针后移动
    }

}
int main() {

    //1.构造多个节点
    Node * head =NULL;
    head = malloc(sizeof(Node*));
    //1.2存储数据的节点
    Node * first =NULL;
    first = malloc(sizeof(Node*));
    Node * second =NULL;
    second = malloc(sizeof(Node*));
    Node * third =NULL;
    third = malloc(sizeof(Node*));

    //2.节点存储数据
    first->data=1;
    second->data=2;
    third->data=3;
    //3.链接成链表
    head->next=first;
    first->next=second;
    second->next=third;
    third->next=NULL;

    printf("打印链表\n");
    //对链表进行打印
    //1.设置一个指针，指向第一节点 2 .打印该节点的元素 3.指针向后移动
 /*   Node* currentNode = head->next;
    while(currentNode!=NULL){
        printf("%d ",currentNode->data);
        currentNode=currentNode->next;//指针后移动
    }*/
    Node *head_list = init();
    traverse(head_list);
    printf("查找测试\n");
    Node *node =NULL;
    int pos = 3;
    node = findByIndex(head_list,pos);
    printf("位置%d的节点元素是:\n",pos);
    printf("%d",node->data);

    ElementType data = 12;
    node = findByValue(head_list,data);
    printf("根据元素找节点\n");
    if(node!=NULL){
        printf("\n该节点被找到");
    } else{
        printf("请更换数据进行测试");
    }
    //printf("Hello, World!\n");
    return 0;
}
